package com.demo.utils;

import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.interfaces.DecodedJWT;
import com.demo.domain.User;

import java.util.Date;

public class Token {
    private static final long EXPIRE_TIME=3*24*60*60*1000;//3天后过期
    private static final String TOKEN_SECRET="test";//密钥盐

    /**
     * 签名生成
     * 生成jwt字符串，十分钟后过期
     */

    public static String sign(Long uid){
        String token = null;
        try{
            Date expiresAt = new Date(System.currentTimeMillis() + EXPIRE_TIME);
            //生成令牌
            token = JWT.create()
                    //签发人
                    .withIssuer("auth0")
                    //接受者 将uid保存到token里面
                    .withAudience(String.valueOf(uid))
                    //存放自定义数据
                    .withClaim("uid",uid)
                    //设置过期时间
                    .withExpiresAt(expiresAt)
                    //token的密钥 使用了HMAC256加密算法
                    .sign(Algorithm.HMAC256(TOKEN_SECRET));//设置签名，保留，复杂
            System.out.println("token = "+ token);
        }catch(Exception e){
            e.printStackTrace();
        }
        return token;
    }

    /**
     * 签名验证
     * 解析token
     */
    public static DecodedJWT verify(String token){
        JWTVerifier verifier = null;
        DecodedJWT jwt = null;

            //解析token
            verifier = JWT.require(Algorithm.HMAC256(TOKEN_SECRET)).withIssuer("auth0").build();
            jwt = verifier.verify(token);
            //认证通过之后，将token中用户表示userid赋值给一个线程内部存储变量
            System.out.println("认证通过：");
            System.out.println("userid:"+jwt.getAudience());
            System.out.println("过期时间：    "+jwt.getExpiresAt());
        return jwt;
    }
}
